package com.evan.review.handler;

import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.MessageQueue;
import android.widget.Button;
import android.widget.ScrollView;
import android.widget.TextView;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

import com.evan.review.R;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.TimeUnit;

/**
 * IdleHandler使用示例
 * 
 * 本Activity演示MessageQueue.IdleHandler的使用，主要包括：
 * 1. IdleHandler的添加与移除
 * 2. IdleHandler的触发时机
 * 3. IdleHandler的返回值含义
 * 4. IdleHandler的实际应用场景
 */
public class IdleHandlerActivity extends AppCompatActivity {
    
    private TextView tvLog;
    private ScrollView scrollView;
    private Button btnAddTasks;
    private Button btnAddIdleHandler;
    private Button btnAddOneShotIdleHandler;
    private Button btnRemoveAllIdleHandlers;
    
    // 主线程Handler
    private final Handler mainHandler = new Handler(Looper.getMainLooper());
    
    // 存储添加的IdleHandler，用于后续移除
    private final List<MessageQueue.IdleHandler> idleHandlers = new ArrayList<>();
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_idle_handler);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });
        
        initViews();
        setupListeners();
    }
    
    private void initViews() {
        tvLog = findViewById(R.id.tv_log);
        scrollView = findViewById(R.id.scroll_view);
        btnAddTasks = findViewById(R.id.btn_add_tasks);
        btnAddIdleHandler = findViewById(R.id.btn_add_idle_handler);
        btnAddOneShotIdleHandler = findViewById(R.id.btn_add_one_shot_idle_handler);
        btnRemoveAllIdleHandlers = findViewById(R.id.btn_remove_idle_handlers);
    }
    
    private void setupListeners() {
        // 添加普通消息任务按钮
        btnAddTasks.setOnClickListener(v -> {
            logMessage("添加5个常规消息任务...");
            
            // 添加5个常规消息任务，每个任务间隔200ms
            for (int i = 1; i <= 5; i++) {
                final int taskNum = i;
                mainHandler.postDelayed(() -> {
                    logMessage("执行任务 #" + taskNum);
                    // 模拟任务执行时间，睡眠100ms
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }, 200 * i);
            }
        });
        
        // 添加永久生效的IdleHandler按钮
        btnAddIdleHandler.setOnClickListener(v -> {
            // 获取主线程的MessageQueue
            Looper.myQueue().addIdleHandler(createPersistentIdleHandler());
            logMessage("添加了永久生效的IdleHandler...");
        });
        
        // 添加一次性IdleHandler按钮
        btnAddOneShotIdleHandler.setOnClickListener(v -> {
            // 一次性IdleHandler执行一次后自动移除
            Looper.myQueue().addIdleHandler(createOneShotIdleHandler());
            logMessage("添加了一次性IdleHandler...");
        });
        
        // 移除所有IdleHandler按钮
        btnRemoveAllIdleHandlers.setOnClickListener(v -> {
            for (MessageQueue.IdleHandler idleHandler : idleHandlers) {
                Looper.myQueue().removeIdleHandler(idleHandler);
            }
            idleHandlers.clear();
            logMessage("已移除所有IdleHandler...");
        });
    }
    
    /**
     * 创建一个永久生效的IdleHandler
     * 返回true表示保留，消息队列空闲时会重复执行
     */
    private MessageQueue.IdleHandler createPersistentIdleHandler() {
        MessageQueue.IdleHandler idleHandler = () -> {
            long startTime = System.nanoTime();
            
            logMessage("永久IdleHandler执行中 - 执行一些空闲时的工作");
            
            // 模拟执行一些不紧急的操作，如缓存清理、数据预加载等
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            
            long duration = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime);
            logMessage("永久IdleHandler执行完成，耗时: " + duration + "ms");
            
            // 返回true表示保留此IdleHandler，下次队列空闲时会再次执行
            return true;
        };
        
        // 保存引用，以便后续移除
        idleHandlers.add(idleHandler);
        
        return idleHandler;
    }
    
    /**
     * 创建一个一次性的IdleHandler
     * 返回false表示执行一次后自动移除
     */
    private MessageQueue.IdleHandler createOneShotIdleHandler() {
        MessageQueue.IdleHandler idleHandler = () -> {
            long startTime = System.nanoTime();
            
            logMessage("一次性IdleHandler执行中 - 预加载资源");
            
            // 模拟执行一次性任务，如页面初始化后的数据预加载
            try {
                Thread.sleep(150);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            
            long duration = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime);
            logMessage("一次性IdleHandler执行完成，耗时: " + duration + "ms，将被自动移除");
            
            // 返回false表示不保留此IdleHandler，执行一次后自动移除
            return false;
        };
        
        // 不需要保存引用，因为会自动移除
        return idleHandler;
    }
    
    /**
     * 记录日志消息到UI
     */
    private void logMessage(String message) {
        if (isFinishing()) return;
        
        String timeStamp = new SimpleDateFormat("HH:mm:ss.SSS", Locale.getDefault())
                .format(new Date());
        
        final String logMsg = "[" + timeStamp + "] " + message;
        
        mainHandler.post(() -> {
            tvLog.append(logMsg + "\n\n");
            // 自动滚动到底部
            scrollView.post(() -> scrollView.fullScroll(ScrollView.FOCUS_DOWN));
        });
    }
    
    /**
     * 演示IdleHandler的实际应用场景
     * 在Activity创建完成后使用IdleHandler执行一些低优先级的初始化操作
     */
    private void demonstrateRealWorldUsage() {
        // 例如，在Activity创建完成并显示后，预加载下一个页面可能用到的数据
        Looper.myQueue().addIdleHandler(() -> {
            // 模拟预加载数据或初始化组件
            logMessage("实际应用示例: 页面显示后延迟初始化不紧急组件");
            // 返回false表示执行一次后移除
            return false;
        });
    }
    
    @Override
    protected void onResume() {
        super.onResume();
        // 演示IdleHandler的实际使用场景
        demonstrateRealWorldUsage();
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 清理工作
        mainHandler.removeCallbacksAndMessages(null);
        // 移除所有IdleHandler
        for (MessageQueue.IdleHandler idleHandler : idleHandlers) {
            Looper.myQueue().removeIdleHandler(idleHandler);
        }
        idleHandlers.clear();
    }
} 